特定のIAM Identity CenterユーザーのみAssumeRoleできるIAMロールを作成する
はじめに
マルチアカウント環境ではIAM Identity Centerを使ってメンバーアカウントへログインすることが多いかと思います。 今回は特定のIAM Identity CenterユーザーのみAssumeRoleできるIAMロールを作成してみました。
前提
この記事ではマルチアカウント環境を前提としているため、以下については既に有効化・作成されているものとして進めます。
- Control Tower or Organizations
- IAM Identity Center
- メンバーアカウントへログインできるIAM Identity Centerユーザー
- IAM Identity Centerユーザーが利用するアクセス許可セット
今回は以下2つのIAM Identity Centerユーザーを作成して、Administorator権限のアクセス許可セットでログインしています。
- User-A
- User-B
やってみる
AssumeRoleする条件として特定のIAMロール
を指定したい場合は、Conditionでaws:useridを指定することで実現可能です。
そのため、最初はuseridを取得してからIAMロールにその値を設定していきます。
SSO作成ロール(SSO-Oparator)のIDを取得
アクセス許可セットによって作成されたIAMロール(ここではSSO-Oparator)のIDを取得します。このIDを使いPrincipalのConditionに指定することで、後ほど作成するIAMロールへAssumeRoleできる範囲を制御することができます。
取得方法は、メンバーアカウントへログインしてアクセス許可セットのIAMロールを確認します。IAMロール名はAWSReservedSSO_${アクセス許可セット名}_ランダムな文字列
の形式です。
IAMロール名が確認できたら、CloudShellで以下のコマンドを実行しましょう。${SSO_IAMロール名}
を確認したロール名に置き換えてください。
$ aws iam get-role --role-name ${SSO_IAMロール名}
レスポンスとして以下のようなものが返ってきますので、RoleId
の値を控えておいてください。
{ "Role": { "Path": "/aws-reserved/sso.amazonaws.com/ap-northeast-1/", "RoleName": "AWSReservedSSO_SSO-Operator_8024796f8153200d", "RoleId": "AROARSGOY76EQO3X62REY", "Arn": "arn:aws:iam::111111111111:role/aws-reserved/sso.amazonaws.com/ap-northeast-1/AWSReservedSSO_SSO-Operator_8024796f8153200d", "CreateDate": "2023-08-17T05:37:48+00:00", "AssumeRolePolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::111111111111:saml-provider/AWSSSO_aa8cddd91b0c9203_DO_NOT_DELETE" }, "Action": [ "sts:AssumeRoleWithSAML", "sts:TagSession" ], "Condition": { "StringEquals": { "SAML:aud": "https://signin.aws.amazon.com/saml" } } } ] }, "MaxSessionDuration": 43200, "RoleLastUsed": {} } }
IAMロールの作成
User-AのみがAssumeRoleできるIAMロールを作成します。IAMロールの作成権限を持ったロール等でメンバーアカウントへログインしてください。
IAMのコンソールからロールを開いて、ロールの作成
をクリックします。
信頼されたエンティティはAWSアカウント
を選択して次へ進みます。許可ポリシーはなんでも大丈夫です。今回はお試しなのでAdministratorAccessを選択しました。
IAMロール名にと説明をわかりやすいもので入力して作成してください。この画面ではJson形式で表示された信頼されたエンティティの編集ができないため、作成後に編集します。
Principalの編集
作成したIAMロールの詳細を開いて、信頼関係
> 信頼ポリシーを編集
をクリックします。
空欄のConditionを以下のように書き換えてください。<RoleId>
は最初に取得したアクセス許可セットのIAMロールID、<UserName>
はIAM Identity Centerのユーザー名です。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::<AWS-account-ID>:root" }, "Action": "sts:AssumeRole", "Condition": { "StringEquals": { "aws:userid": [ "<RoleId>:<UserName>", ] } } } ] }
実際に置き換えたらこんな感じになります。
これでUser-Aでログインした人しかAssumeRoleできない状態になりました。
AssumeRoleできるか確認
User-Aでログインし、スイッチできるか試してみます。
コンソール右上から、ロールの切り替え
をクリックします。
以下の情報を入力します。
- アカウント: ログインしているAWSアカウントID
- ロール: IamRoleForUserA
表示名と色はお好みでどうぞ
ロールの切り替えをクリックした時、AWSコンソールが表示されればOKです。右上にAssumeRole後のIAMロール名が表示されているのが確認できました。
IAM Identity CenterユーザーをUser-Bに切り替えて同じ手順を実施してみます。
すると、AWSコンソールは遷移せずに以下のようなエラーメッセージが表示されました。
IAMロールの信頼ポリシーで制御されているため、AssumeRoleができないためエラーとなっているようです。想定通りIAM Identity CenterユーザーによるAssumeRole制御ができました。
もしUser-BにもAssumeRoleを許可したい場合は、IAMロールの信頼ポリシーに追加すればOKです。
まとめ
特定のIAM Identity CenterユーザーでしかAssumeRoleできないIAMロールを作成してみました。
特定のユーザーのみ追加の権限を与えたい場合には、こうしたAssumeRoleの制御方法を検討してみてはいかがでしょうか?